﻿// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com

// ReSharper disable CheckNamespace
// ReSharper disable CommentTypo
// ReSharper disable IdentifierTypo
// ReSharper disable InconsistentNaming
// ReSharper disable UnusedMember.Global

/* DRAWITEMSTRUCT.cs -- инфорация о контроле или элементе меню, которые необходимо отрисовать
 * Ars Magna project, http://arsmagna.ru
 */

#region Using directives

using System;
using System.Drawing;
using System.Runtime.InteropServices;

#endregion

#nullable enable

namespace AM.Win32;

/// <summary>
/// Предоставляет информацию, которую использует окно владельца,
/// чтобы определить, как рисовать нарисованный владельцем элемент
/// управления или элемент меню. Окно владельца нарисованного
/// владельцем элемента управления или пункта меню получает
/// указатель на эту структуру в качестве параметра lParam
/// сообщения WM_DRAWITEM.
/// </summary>
[StructLayout (LayoutKind.Sequential)]
public struct DRAWITEMSTRUCT
{
    /// <summary>
    /// Тип контрола.
    /// </summary>
    public int CtlType;

    /// <summary>
    /// Идентификатор поля со списком, списка, кнопки или
    /// статического элемента управления. Этот элемент
    /// не используется для пункта меню.
    /// </summary>
    public int CtlID;

    /// <summary>
    /// Идентификатор пункта меню для пункта меню или индекс пункта
    /// в списке или поле со списком. Для пустого списка или поля
    /// со списком этот член может быть равен -1. Это позволяет
    /// приложению рисовать только прямоугольник фокуса с координатами,
    /// указанными в члене rcItem, даже если в элементе управления
    /// нет элементов. Это указывает пользователю, имеет ли
    /// фокус поле со списком или поле со списком. То, как биты
    /// установлены в члене itemAction, определяет, должен ли
    /// прямоугольник быть нарисован так, как если бы поле списка
    /// или поле со списком имело фокус.
    /// </summary>
    public int itemID;

    /// <summary>
    /// Требуемое действие рисования.
    /// </summary>
    public int itemAction;

    /// <summary>
    /// Визуальное состояние элемента после выполнения текущего
    /// действия рисования.
    /// </summary>
    public int itemState;

    /// <summary>
    /// Дескриптор элемента управления для полей со списком, списков,
    /// кнопок и статических элементов управления. Для меню этот член
    /// является дескриптором меню, которое содержит элемент.
    /// </summary>
    public IntPtr hwndItem;

    /// <summary>
    /// Дескриптор контекста устройства; этот контекст устройства
    /// должен использоваться при выполнении операций рисования
    /// на элементе управления.
    /// </summary>
    public IntPtr hDC;

    /// <summary>
    /// Прямоугольник, определяющий границы рисуемого элемента
    /// управления. Этот прямоугольник находится в контексте устройства,
    /// указанном элементом hDC. Система автоматически обрезает все,
    /// что окно владельца рисует в контексте устройства для полей
    /// со списком, списков и кнопок, но не обрезает элементы меню.
    /// При рисовании пунктов меню окно владельца не должно выходить
    /// за границы прямоугольника, определенного элементом rcItem.
    /// </summary>
    public Rectangle rcItem;

    /// <summary>
    /// Определяемое приложением значение, связанное с пунктом меню.
    /// Для элемента управления этот параметр указывает значение,
    /// присвоенное последним списку или комбинированному полю
    /// сообщением LB_SETITEMDATA или CB_SETITEMDATA.\
    /// </summary>
    public IntPtr itemData;
}
